#ifndef __CORETHREAD_H__
#define __CORETHREAD_H__

#include <atomic>
#include "ThreadPoolObject.h"
#include "WorkStealingQueue.h"

HTHREADPOOL_NAMESPACE_BEGIN
    // 该类可以实现线程退出后可继续执行
    class CoreThread final : public ThreadPoolObject
    {
    public:
        explicit CoreThread(int                                       index,
                            AtomicQueue<Task>*                        poolTaskQueue,
                            std::vector<std::unique_ptr<CoreThread>>* poolThread);
        ~CoreThread();

    protected:
        virtual void run() override;
        virtual void excuteTask() override;
        virtual void excuteTasks() override;
        virtual void exit() override;

        // 经过调度器直接推入,减少竞争,不需要所有的任务队列都推入一个公共的任务队列
        void commit(Task&& task);

    private:
        bool popTask(TaskRef task);
        bool popTask(TaskArrRef tasks);
        bool stealTask(TaskArrRef tasks);
        bool stealTask(TaskRef tasks);

    private:
        int               m_index;           // 在核心线程vector的位置，主要用来拿相邻的线程的任务
        WorkStealingQueue m_loaclWorkQueue;  // 本地线程的任务队列
        std::vector<std::unique_ptr<CoreThread>>* m_pool_threads;  // 核心线程容器的地址，因为核心线程的数量不会动态变化
    };

    using CoreThreadPtr = CoreThread*;

HTHREADPOOL_NAMESPACE_END

#endif
